package com.marmot.cloud.framework.core.exception;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 业务异常类，用于表示业务逻辑执行过程中可能出现的异常情况。
 * 继承自 RuntimeException。
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class BusinessException extends RuntimeException {
    private static final String DEFAULT_CODE = "500";

    /**
     * 错误码，默认为 "500"。
     */
    protected String code = DEFAULT_CODE;

    /**
     * 错误信息。
     */
    protected String msg;

    /**
     * 无参构造函数。
     */
    public BusinessException() {
        super();
    }

    /**
     * 构造函数，通过错误消息创建异常实例。
     *
     * @param msg 错误消息
     */
    public BusinessException(String msg) {
        super(msg);
        this.msg = msg;
    }

    /**
     * 构造函数，通过错误码和消息创建异常实例。
     *
     * @param code 错误码
     * @param msg  错误消息
     */
    public BusinessException(String code, String msg) {
        super(msg);
        this.code = code;
        this.msg = msg;
    }

    /**
     * 构造函数，通过错误码、消息和原因创建异常实例。
     *
     * @param code  错误码
     * @param msg   错误消息
     * @param cause 异常原因
     */
    public BusinessException(String code, String msg, Throwable cause) {
        super(msg, cause);
        this.code = code;
        this.msg = msg;
    }

    /**
     * 构造函数，通过原因创建异常实例。
     *
     * @param cause 异常原因
     */
    public BusinessException(Throwable cause) {
        super(cause);
    }

    /**
     * 构造函数，通过错误码、消息、原因、是否抑制、是否可写堆栈跟踪创建异常实例。
     *
     * @param code                  错误码
     * @param msg                   错误消息
     * @param cause                 异常原因
     * @param enableSuppression     是否抑制
     * @param writableStackTrace    是否可写堆栈跟踪
     */
    public BusinessException(String code, String msg, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(msg, cause, enableSuppression, writableStackTrace);
        this.code = code;
        this.msg = msg;
    }

    /**
     * 构造函数，通过 ErrorInfo 对象创建异常实例。
     *
     * @param errorInfo 异常信息
     */
    public BusinessException(ErrorInfo errorInfo) {
        super(errorInfo.getErrorMsg());
        this.code = errorInfo.getErrorCode();
        this.msg = errorInfo.getErrorMsg();
    }

    /**
     * 构造函数，通过 ErrorInfo 对象和原因创建异常实例。
     *
     * @param errorInfo 异常信息
     * @param cause     异常原因
     */
    public BusinessException(ErrorInfo errorInfo, Throwable cause) {
        super(errorInfo.getErrorMsg(), cause);
        this.code = errorInfo.getErrorCode();
        this.msg = errorInfo.getErrorMsg();
    }

    /**
     * 构造函数，通过 ErrorInfo 对象、原因、是否抑制、是否可写堆栈跟踪创建异常实例。
     *
     * @param errorInfo             异常信息
     * @param cause                 异常原因
     * @param enableSuppression     是否抑制
     * @param writableStackTrace    是否可写堆栈跟踪
     */
    public BusinessException(ErrorInfo errorInfo, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(errorInfo.getErrorMsg(), cause, enableSuppression, writableStackTrace);
        this.code = errorInfo.getErrorCode();
        this.msg = errorInfo.getErrorMsg();
    }
}
